package com.wangzhixuan.commons.utils;

import java.security.MessageDigest;

public class MD5Util {
	/**
	 * 让大容量信息在用数字签名软件签署私人密匙前被"压缩"成一种保密的格式
	 * （就是把一个任意长度的字节串变换成一定长的大整数）
	 * MD5的典型应用是对一段信息（Message）产生信息摘要（Message-Digest），以防止被篡改
	 * 把消息分以512位为一分组进行处理，每一个分组进行4轮变换，以上面所说4个常数为起始变量
	 * 进行计算，重新输出4个变量，以这4个变量再进行下一分组的运算，如果已经是最后一个分组，
	 * 则这4个变量为最后的结果，即MD5值
	 * @param s(message)
	 * @return Message-Digest
	 */
	  public static String MD5(String s) {  
		  
	        char hexDigits[]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};         
	  
	        try {  
	            byte[] btInput = s.getBytes();  
	            // 获得MD5摘要算法的 MessageDigest 对象  
	            MessageDigest mdInst = MessageDigest.getInstance("MD5");  
	            // 使用指定的字节更新摘要  
	            mdInst.update(btInput);  
	            // 获得密文  
	            byte[] md = mdInst.digest();  
	            // 把密文转换成十六进制的字符串形式  
	            int j = md.length;  
	            char str[] = new char[j * 2];  
	            int k = 0;  
	            for (int i = 0; i < j; i++) {  
	                byte byte0 = md[i];  
	                str[k++] = hexDigits[byte0 >>> 4 & 0xf];  
	                str[k++] = hexDigits[byte0 & 0xf];  
	            }  
	            return new String(str).toLowerCase();  
	        } catch (Exception e) {  
	            e.printStackTrace();  
	            return null;  
	        }  
	    }  

}
